home *** CD-ROM | disk | FTP | other *** search
- ===========================================================================
- BBS: Canada Remote Systems
- Date: 08-10-93 (01:00) Number: 33744
- From: RYAN THOMPSON Refer#: NONE
- To: TERRY GRANT @ 912/701 Recvd: NO
- Subj: RE: COMMAND LINE PARSING Conf: (1221) F-PASCAL
- ---------------------------------------------------------------------------
- >>> Quoting message from Terry Grant @ 912/701 to All
- >>> Original sent 07 Aug 93 20:36:00 about Command Line Parsing
-
- TG> Hello All!
- TG>
- TG> After working on this for awhile, I thought mabe someone else could help
- TG> me out a little here. All I need this to do is Parse the command line for
- TG> seven parameters,
- TG>
- TG> The BaudRate (/B),
- TG> :
- TG> and Overlay Size (/O).
- TG>
- TG> My Main problem here is, it will SEE the command line, But WILL NOT allow
- TG> me to use anything AFTER the Switch ? Like /B2400 !
-
- Sure thing! I once wrote a unit which among other things has some neat
- parsing for the command line. Here's a snippet:
-
- {- Top -}
-
- Function SwitchNum(S : String) : Integer;
- { If a switch character specified exists, return which position }
- { it is in on the command line. Used internally. }
- Var
- Temp : String;
- X,
- Y : Integer;
- Begin
- Temp:= '';
- X:= ParamCount;
- Y:= 0;
- while (X > 0) and (Y = 0) do begin
- Temp:= ParamStr(X);
- if (Temp[1] = '/') or (Temp[1] = '-') then
- if UpCase(Temp[2]) = UpString(S) then Y:= X;
- Dec(X);
- end;
- SwitchNum:= Y;
- End;
-
-
- Function SwitchThere(S : String) : Boolean;
- { Returns TRUE if a switch of the character specified exists. }
- Begin
- If SwitchNum(S) = 0 then SwitchThere:= False
- else SwitchThere:= True;
- End;
-
-
- Function SwitchData(S : String) : String;
- { Return the data following a switch: /B2400 returns 2400. }
- Var
- Temp : String;
- Begin
- If SwitchNum(S) > 0 then begin
- Temp:= ParamStr(SwitchNum(S));
- Delete(Temp, 1, 2);
- end
- else Temp:= '';
- SwitchData:= Temp;
- End;
-
-
- Function Parameter(N : Byte) : String;
- { Returns the Nth command line parameter. Parameters in quotes }
- { are returned with the spaces in between: /D Test "One Two" }
- { Returns >Test< for Parameter(1) and >"One Two< for Parameter(2) }
- { This allows you to, if you like, see what type of quote was }
- { used, for perhaps literal vs. translate to ALL CAPS. }
- Var
- X,
- Count : Byte;
- Parm,
- Temp : String;
- Begin
- X:= 0;
- Count:= 0;
- Parm:= '';
- If ParamCount > 0 then repeat
- Inc(X);
- Temp:= ParamStr(X);
- If (Temp[1] = '"') or (Temp[1] = '''') then begin
- Parm:= Temp;
- If X < ParamCount then repeat
- Inc(X);
- Parm:= Parm + ' ' + ParamStr(X);
- until (Parm[Length(Parm)] = '"') or
- (Parm[Length(Parm)] = '''') or (X = ParamCount);
- Inc(Count);
- end
- else if (Temp[1] <> '/') and (Temp[1] <> '-')
- then begin
- Inc(Count);
- Parm:= Temp;
- end;
- until (X = ParamCount) or (Count = N);
- If Count = N then Parameter:= Parm
- else Parameter:= '';
- End;
-
-
- Function Parameters : Byte;
- { Return the number of non-switch parameters on the command line. }
- Var
- X : Byte;
- Begin
- X:= 0;
- If ParamCount > 0 then begin
- Repeat
- Inc(X)
- Until Parameter(X) = '';
- Parameters:= X - 1;
- end
- else Parameters:= 0;
- End;
-
- {- Fin -}
-
- A few examples:
-
- If SwitchThere('?') then DisplayHelp;
- If SwitchThere('B') then BaudString:= SwitchData('B');
- If Parameters < 1 then begin WriteLn('Too few parms'); Halt; end;
- For X:= 1 to Parameters do
- begin
- Param[X]:= Parameter(X);
- end;
-
- Sample command lines:
-
- TESTPROG /D /F TEST /B2400 "This is a test" /M-
-
- Parameters returns 2,
- Parameter(1) returns TEST
- Parameter(2) returns "This is a test
- SwitchThere('L') returns False
- SwitchData('M') returns -
- SwitchData('G') returns null.
-
- I hope this helps you out! It could be optimized a lot by simply reading
- all of the parameters into an array in your initialization code, to eliminate
- all of the redundant parsing, but I don't think that parsing time for a few
- hundred characters at most is a limiting factor of any sort. ;-)
-
- bye
- Ryan
-
- --- Renegade v07-17 Beta